/**
 * 文件：DisplayedGameDAO.java
 * 作者：苏新阳
 * 完成度：进行中
 * 最后修改日期：2023-7-3 19:22
 */
package com.gomokult.dao;

import com.gomokult.entity.GameDisplayInfo;
import com.gomokult.exception.DuplicatedOperationException;
import com.gomokult.exception.IllegalOperationException;
import com.gomokult.exception.InvalidIDException;

import java.util.List;

public interface DisplayedGameDAO {
    /**
     * 根据用户名userID查询用户展示页面的页数
     * @param userID 用于筛选特定用户的对局
     * @return 返回查询的对局的总数
     * @throws InvalidIDException 当ID无效或不存在时
     */
    int getUserDisplayedGamesCount(int userID);

    /**
     * 根据用户名userID,表中开始的条数，从开始条数查询end条数据，返回查询的加入个人主页的对局实体
     * @param start 对局的开始的条数
     * @param end 要查询的条数
     * @param userID 用于筛选特定用户的对局
     * @return 返回查询的对局
     * @throws InvalidIDException 当ID无效或不存在时
     */
    List<GameDisplayInfo> getUserDisplayedGamesFromPage(int start,int end,int userID);

    /**
     * 根据用户名userID,gameID筛选dispalyGames表中是否有该条记录
     * @param userID 筛选用户
     * @param gameID 筛选对局
     * @return 返回bool值，判断表中是否有该条记录
     * @throws IllegalOperationException 当用户{@code userID}不是目标对局的参与者时
     */
    boolean isGameDisplayed(int userID, int gameID);

    /**
     * 将对局{@code gameID}添加到用户{@code userID}的对局展示页。
     * @param userID 目标用户ID
     * @param gameID 需要被添加到展示页的对局ID
     * @param description 描述字段，可用于显示用户推荐展示该对局的理由
     * @throws DuplicatedOperationException 当目标对局已存在于该用户的展示页中时
     */
    void addGameToDisplay(int userID, int gameID, String description);

    /**
     * 将对局{@code gameID}从用户{@code userID}的对局展示页中移除。当目标对局本就不存在于该用户的对局展示页时，该方法不造成任何影响，也不必抛出任何异常。
     * @param userID 目标用户ID
     * @param gameID 需要被从展示页中移除的对局ID
     * @throws InvalidIDException 当ID无效或不存在时
     */

    void deletedisplayGame(int userID, int gameID);
    /**
     * 将对局{@code gameID}从用户{@code userID}的对局展示页中移除。当目标对局本就不存在于该用户的对局展示页时，该方法不造成任何影响，也不必抛出任何异常。
     * @param userID 目标用户ID
     * @param gameID 需要被从展示页中移除的对局ID
     * @throws InvalidIDException 当ID无效或不存在时
     */

    /**
     * service实现类传来GameDisplayInfo实体，将实体中的desciption更新
     * @param game service传来的GameDisplayInfo实体
     */
    void updateGame(GameDisplayInfo game);

}
